package com.su.gulimall.search.thread;

import org.apache.catalina.Executor;

import java.util.concurrent.*;
//线程的四种创建方法
/*
* 总结：
* （1）方式二优于方式一在于类的实现比类的继承具有优越性
* （2）方式三优于方式一，二的地方在于可以实现方法返回值的获取
* （3）方式四优于方式一二三的地方在于线程资源的控制
*
* */
public class ThreadTest {
    public static void main(String[] args) {
        System.out.println("main方法开始了");
        //方式四（Executors:线程池）
        ExecutorService service = Executors.newFixedThreadPool(10);
        Thread02 thread02 = new Thread02();
        service.submit(thread02);
        service.execute(thread02);
        System.out.println("main方法结束了");
        /*(1)一个线程池 core 7,max 20,queue 50 ,100并发进来怎么分配的；
         *(2)7个立即执行，50个进入队列，此时线程池继续开启线程，给予13个任务处理；剩余30使用拒绝策略进行丢弃；
         *(3)如果不想抛弃，使用拒绝策略CallerRunsPolicy;
         * */
        //方式五(手动线程池)
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5,200,10,
                 TimeUnit.SECONDS,new LinkedBlockingDeque<>(100000),
                 Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
        //方式六（Executors:线程池）
        Executors.newCachedThreadPool();//带缓存
        Executors.newFixedThreadPool(10);//
        Executors.newScheduledThreadPool(10);
        Executors.newSingleThreadExecutor();

    }

    //方式一：继承Thread
    public static class Thread01 extends Thread{
        @Override
        public void run() {
            System.out.println("当前线程:"+Thread.currentThread().getId());
            int i=10/2;
            System.out.println("运行结果为："+i);
        }
    }
    //方式二:实现Runnable
    public static class  Thread02 implements Runnable{

        @Override
        public void run() {

            System.out.println("当前线程:"+Thread.currentThread().getId());
            int i=10/2;
            System.out.println("运行结果为："+i);

        }
    }
    //方式三:实现Callable
    public  static  class  Thread03 implements Callable {

        @Override
        public Integer call() throws Exception {
            System.out.println("当前线程:"+Thread.currentThread().getId());
            int i=10/2;
            return i;
        }
    }
}
